Use __builtin_operator_new/__builtin_operator_delete when available. This allows allocations and deallocations to be optimized out. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@210211 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/__config b/include/__config index f803c9a..609b587 100644 --- a/include/__config +++ b/include/__config
@@ -550,12 +550,20 @@ #define __has_feature(__x) 0 #endif +#ifndef __has_builtin +#define __has_builtin(__x) 0 +#endif + #if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) # define _LIBCPP_EXPLICIT explicit #else # define _LIBCPP_EXPLICIT #endif +#if !__has_builtin(__builtin_operator_new) || !__has_builtin(__builtin_operator_delete) +# define _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE +#endif + #ifdef _LIBCPP_HAS_NO_STRONG_ENUMS #define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx #define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \ diff --git a/include/__sso_allocator b/include/__sso_allocator index 7240072..645f2ba 100644 --- a/include/__sso_allocator +++ b/include/__sso_allocator
@@ -55,14 +55,14 @@ __allocated_ = true; return (pointer)&buf_; } - return static_cast<pointer>(::operator new(__n * sizeof(_Tp))); + return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp))); } _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) { if (__p == (pointer)&buf_) __allocated_ = false; else - ::operator delete(__p); + _VSTD::__deallocate(__p); } _LIBCPP_INLINE_VISIBILITY size_type max_size() const throw() {return size_type(~0) / sizeof(_Tp);} diff --git a/include/experimental/dynarray b/include/experimental/dynarray index 7c5c9b3..d2a4298 100644 --- a/include/experimental/dynarray +++ b/include/experimental/dynarray
@@ -147,12 +147,12 @@ assert(!"dynarray::allocation"); #endif } - return static_cast<value_type *> (::operator new (sizeof(value_type) * count)); + return static_cast<value_type *> (_VSTD::__allocate (sizeof(value_type) * count)); } static inline _LIBCPP_INLINE_VISIBILITY void __deallocate ( value_type* __ptr ) noexcept { - ::operator delete (static_cast<void *> (__ptr)); + _VSTD::__deallocate (static_cast<void *> (__ptr)); } public: diff --git a/include/memory b/include/memory index d19bb7f..beff3c9 100644 --- a/include/memory +++ b/include/memory
@@ -1631,9 +1631,9 @@ _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT {return _VSTD::addressof(__x);} _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) - {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));} + {return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp)));} _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT - {::operator delete((void*)__p);} + {_VSTD::__deallocate((void*)__p);} _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT {return size_type(~0) / sizeof(_Tp);} #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) @@ -1721,9 +1721,9 @@ _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT {return _VSTD::addressof(__x);} _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) - {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));} + {return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp)));} _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT - {::operator delete((void*)__p);} + {_VSTD::__deallocate((void*)__p);} _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT {return size_type(~0) / sizeof(_Tp);} #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) diff --git a/include/new b/include/new index ea4a4a0..a710ed9 100644 --- a/include/new +++ b/include/new
@@ -147,4 +147,24 @@ inline _LIBCPP_INLINE_VISIBILITY void operator delete (void*, void*) _NOEXCEPT {} inline _LIBCPP_INLINE_VISIBILITY void operator delete[](void*, void*) _NOEXCEPT {} +_LIBCPP_BEGIN_NAMESPACE_STD + +inline _LIBCPP_INLINE_VISIBILITY void *__allocate(size_t __size) { +#ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE + return ::operator new(__size); +#else + return __builtin_operator_new(__size); +#endif +} + +inline _LIBCPP_INLINE_VISIBILITY void __deallocate(void *__ptr) { +#ifdef _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE + ::operator delete(__ptr); +#else + __builtin_operator_delete(__ptr); +#endif +} + +_LIBCPP_END_NAMESPACE_STD + #endif // _LIBCPP_NEW diff --git a/include/valarray b/include/valarray index 5113516..3714350 100644 --- a/include/valarray +++ b/include/valarray
@@ -345,6 +345,7 @@ #include <initializer_list> #include <algorithm> #include <functional> +#include <new> #include <__undef_min_max> @@ -2636,7 +2637,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<result_type*>(::operator new(__n * sizeof(result_type))); + static_cast<result_type*>(_VSTD::__allocate(__n * sizeof(result_type))); for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i) ::new (__r.__end_) result_type(__expr_[__i]); } @@ -2670,7 +2671,7 @@ { if (__n) { - __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); #ifndef _LIBCPP_NO_EXCEPTIONS try { @@ -2695,7 +2696,7 @@ { if (__v.size()) { - __begin_ = __end_ = static_cast<value_type*>(::operator new(__v.size() * sizeof(value_type))); + __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__v.size() * sizeof(value_type))); #ifndef _LIBCPP_NO_EXCEPTIONS try { @@ -2736,7 +2737,7 @@ size_t __n = __il.size(); if (__n) { - __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); #ifndef _LIBCPP_NO_EXCEPTIONS try { @@ -2764,7 +2765,7 @@ size_t __n = __sa.__size_; if (__n) { - __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); #ifndef _LIBCPP_NO_EXCEPTIONS try { @@ -2790,7 +2791,7 @@ size_t __n = __ga.__1d_.size(); if (__n) { - __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); #ifndef _LIBCPP_NO_EXCEPTIONS try { @@ -2819,7 +2820,7 @@ size_t __n = __ma.__1d_.size(); if (__n) { - __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); #ifndef _LIBCPP_NO_EXCEPTIONS try { @@ -2848,7 +2849,7 @@ size_t __n = __ia.__1d_.size(); if (__n) { - __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); #ifndef _LIBCPP_NO_EXCEPTIONS try { @@ -3133,7 +3134,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) ::new (__r.__end_) value_type(+*__p); } @@ -3150,7 +3151,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) ::new (__r.__end_) value_type(-*__p); } @@ -3167,7 +3168,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) ::new (__r.__end_) value_type(~*__p); } @@ -3184,7 +3185,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<bool*>(::operator new(__n * sizeof(bool))); + static_cast<bool*>(_VSTD::__allocate(__n * sizeof(bool))); for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) ::new (__r.__end_) bool(!*__p); } @@ -3504,7 +3505,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); const value_type* __sb; value_type* __tb; value_type* __te; @@ -3542,7 +3543,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); __i %= static_cast<int>(__n); const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i; for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s) @@ -3563,7 +3564,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) ::new (__r.__end_) value_type(__f(*__p)); } @@ -3580,7 +3581,7 @@ { __r.__begin_ = __r.__end_ = - static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) ::new (__r.__end_) value_type(__f(*__p)); } @@ -3595,12 +3596,12 @@ { while (__end_ != __begin_) (--__end_)->~value_type(); - ::operator delete(__begin_); + _VSTD::__deallocate(__begin_); __begin_ = __end_ = nullptr; } if (__n) { - __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); #ifndef _LIBCPP_NO_EXCEPTIONS try {